@ExceptionHandler এবং @ControllerAdvice এর মাধ্যমে Exception Handling

Java Technologies - স্প্রিং বুট জেপিএ (Spring Boot JPA) - Exception Handling এবং Logging
303

Exception Handling স্প্রিং বুট অ্যাপ্লিকেশনগুলিতে অত্যন্ত গুরুত্বপূর্ণ, বিশেষত যখন ডেটাবেসের সাথে কাজ করা হয়, যেমন JPA (Java Persistence API) ব্যবহার করে ডেটাবেস অপারেশন। স্প্রিং বুটে Exception Handling করার জন্য @ExceptionHandler এবং @ControllerAdvice অ্যানোটেশন দুটি শক্তিশালী টুল সরবরাহ করে। এই অ্যানোটেশনগুলি ডেটাবেস সম্পর্কিত সমস্যাগুলির (যেমন ডেটা না পাওয়া বা ভ্যালিডেশন ত্রুটি) ক্ষেত্রে উপযুক্ত ত্রুটি বার্তা প্রদানে সহায়ক।


@ExceptionHandler এবং @ControllerAdvice

  1. @ExceptionHandler: এই অ্যানোটেশনটি ক্লাসের মধ্যে ব্যবহার করা হয় এবং এটি শুধুমাত্র একটি নির্দিষ্ট এক্সসেপশন টাইপের জন্য ব্যবহৃত হয়। এটি একটি বিশেষ মেথডকে চিহ্নিত করে যা স্প্রিং এমভিসি কন্ট্রোলার ক্লাসে এক্সসেপশন হ্যান্ডেল করার জন্য ব্যবহার করা হয়।
  2. @ControllerAdvice: এটি একটি বৈশিষ্ট্য যা স্প্রিং ফ্রেমওয়ার্কে ব্যবহৃত হয় এবং এটি একাধিক কন্ট্রোলারে সাধারণ এক্সসেপশন হ্যান্ডলিং কার্যকর করার জন্য ব্যবহৃত হয়। এটি একটি গ্লোবাল এক্সসেপশন হ্যান্ডলার তৈরি করতে সহায়ক, যার মাধ্যমে অ্যাপ্লিকেশনের যেকোনো কন্ট্রোলারের জন্য এক্সসেপশন হ্যান্ডল করা সম্ভব।

@ExceptionHandler এবং @ControllerAdvice এর ব্যবহার

Step ১: Entity ক্লাস

ধরা যাক, আমাদের একটি Employee টেবিলের জন্য একটি Entity ক্লাস তৈরি আছে:

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String department;
    private double salary;

    // Getters and Setters
}

Step ২: Repository তৈরি

স্প্রিং ডেটা জেপিএ ব্যবহার করে Repository তৈরি করা হয়।

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    Employee findById(long id);
}

এখানে, findById মেথডটি Employee টেবিল থেকে একটি নির্দিষ্ট কর্মচারী খুঁজে বের করবে।


Step ৩: Service ক্লাস

Service ক্লাসে Repository ইনজেক্ট করে ডেটাবেস অপারেশন করা হয়।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository;

    public Employee getEmployeeById(long id) {
        return employeeRepository.findById(id)
                .orElseThrow(() -> new EmployeeNotFoundException("Employee not found with id: " + id));
    }
}

এখানে, যদি Employee মডেল না পাওয়া যায়, তবে একটি কাস্টম এক্সসেপশন EmployeeNotFoundException ছোড়া হবে।


Step ৪: কাস্টম এক্সসেপশন তৈরি করা

এখানে একটি কাস্টম এক্সসেপশন EmployeeNotFoundException তৈরি করা হয়েছে:

public class EmployeeNotFoundException extends RuntimeException {
    public EmployeeNotFoundException(String message) {
        super(message);
    }
}

এই এক্সসেপশনটি EmployeeService ক্লাসে ব্যবহার করা হয়েছে, যেখানে ডেটা না পাওয়া গেলে এটি ছোড়া হবে।


Step ৫: @ExceptionHandler ব্যবহার করা

@ExceptionHandler অ্যানোটেশনটি ব্যবহার করে, আপনি একটি নির্দিষ্ট এক্সসেপশন হ্যান্ডল করতে পারেন:

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(EmployeeNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String handleEmployeeNotFoundException(EmployeeNotFoundException ex) {
        return ex.getMessage();
    }
}

এখানে, @ExceptionHandler(EmployeeNotFoundException.class) ব্যবহার করা হয়েছে। এটি EmployeeNotFoundException এক্সসেপশনটি হ্যান্ডল করবে এবং HttpStatus.NOT_FOUND (404) স্ট্যাটাস সহ একটি বার্তা রিটার্ন করবে।


Step ৬: @ControllerAdvice ব্যবহার করা

@ControllerAdvice অ্যানোটেশনটি গ্লোবাল এক্সসেপশন হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। এটি একটি ক্লাসের উপরে বসিয়ে সমস্ত কন্ট্রোলারগুলির জন্য এক্সসেপশন হ্যান্ডলিং বাস্তবায়ন করা হয়।

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(EmployeeNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String handleEmployeeNotFoundException(EmployeeNotFoundException ex) {
        return ex.getMessage();
    }

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String handleGeneralException(Exception ex) {
        return "An unexpected error occurred: " + ex.getMessage();
    }
}

এখানে, @ControllerAdvice অ্যানোটেশনটি সমস্ত কন্ট্রোলারের জন্য গ্লোবাল এক্সসেপশন হ্যান্ডলিং করছে। handleEmployeeNotFoundException মেথডটি EmployeeNotFoundException এক্সসেপশন হ্যান্ডল করে, এবং handleGeneralException মেথডটি অন্যান্য সাধারণ এক্সসেপশন হ্যান্ডল করে।


Step ৭: Controller ক্লাস

স্প্রিং Controller ক্লাসে ডেটা রিট্রিভ করার জন্য EmployeeService মেথড কল করা হয়।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    @GetMapping("/employees/{id}")
    public Employee getEmployeeById(@PathVariable long id) {
        return employeeService.getEmployeeById(id);
    }
}

এখানে, EmployeeController ক্লাসে EmployeeService ক্লাসের getEmployeeById মেথড কল করা হয়েছে, যা id এর ভিত্তিতে কর্মচারী খুঁজে বের করবে। যদি কর্মচারী পাওয়া না যায়, তবে EmployeeNotFoundException ছোড়া হবে এবং সেই অনুযায়ী GlobalExceptionHandler এক্সসেপশন হ্যান্ডল করবে।


@ExceptionHandler এবং @ControllerAdvice এর সুবিধা

  1. গ্লোবাল এক্সসেপশন হ্যান্ডলিং: @ControllerAdvice ব্যবহারের মাধ্যমে পুরো অ্যাপ্লিকেশনে এক্সসেপশন হ্যান্ডল করা যায়। এটি একই ধরনের এক্সসেপশন হ্যান্ডল করার জন্য একটি সাধারণ স্থান সরবরাহ করে।
  2. কাস্টম এক্সসেপশন বার্তা: আপনি কাস্টম এক্সসেপশন তৈরি করতে পারেন এবং ব্যবহারকারীদের জন্য একটি পরিষ্কার এবং স্পষ্ট বার্তা প্রদর্শন করতে পারেন।
  3. ডেটাবেস বা সার্ভার সংক্রান্ত ত্রুটির জন্য কার্যকর সমাধান: @ExceptionHandler এবং @ControllerAdvice ব্যবহার করে ডেটাবেস সম্পর্কিত ত্রুটিগুলি (যেমন EntityNotFoundException, ConstraintViolationException) বা সার্ভার ত্রুটি সহজেই হ্যান্ডল করা যায়।
  4. কোড পরিষ্কার রাখা: এক্সসেপশন হ্যান্ডলিং এক্সক্লুসিভভাবে এক্সসেপশন হ্যান্ডলার ক্লাসে রাখতে পারেন, যা কোডকে পরিষ্কার এবং মেইনটেনেবল রাখে।

উপসংহার

স্প্রিং বুটের @ExceptionHandler এবং @ControllerAdvice অ্যানোটেশনগুলি ব্যবহার করে সহজেই এক্সসেপশন হ্যান্ডলিং করা যায়। এটি কাস্টম এক্সসেপশন এবং সাধারণ এক্সসেপশন উভয়ই হ্যান্ডল করার জন্য শক্তিশালী উপায় সরবরাহ করে। @ExceptionHandler একটি নির্দিষ্ট কন্ট্রোলার বা মেথডের জন্য এক্সসেপশন হ্যান্ডল করে, যেখানে @ControllerAdvice গ্লোবালি সমস্ত কন্ট্রোলারের জন্য এক্সসেপশন হ্যান্ডল করতে সহায়ক।


Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...